# Python3 运算符
# 什么是运算符？
# 本章节主要说明 Python 的运算符。
# 举个简单的例子:
# 4 + 5 = 9   # 例子中，4 和 5 被称为操作数，+ 称为运算符。

# Python 语言支持以下类型的运算符:
# 算术运算符
# 比较（关系）运算符
# 赋值运算符
# 逻辑运算符
# 位运算符
# 成员运算符
# 身份运算符
# 运算符优先级


# Python算术运算符
# 以下假设变量 a=10，变量 b=21：
# +	加 - 两个对象相加	a + b 输出结果 31
# -	减 - 得到负数或是一个数减去另一个数	a - b 输出结果 -11
# *	乘 - 两个数相乘或是返回一个被重复若干次的字符串	a * b 输出结果 210
# /	除 - x 除以 y	b / a 输出结果 2.1
# %	取模 - 返回除法的余数	b % a 输出结果 1
# **	幂 - 返回x的y次幂	a**b 为10的21次方
# //	取整除 - 往小的方向取整数   9//2 =4 -9//2 =-5
a = 21
b = 10
c = 0
c = a + b
print("1 - c 的值为：", c)
c = a - b
print("2 - c 的值为：", c)
c = a * b
print("3 - c 的值为：", c)
c = a / b
print("4 - c 的值为：", c)
c = a % b
print("5 - c 的值为：", c)
# 修改变量 a 、b 、c
a = 2
b = 3
c = a ** b
print("6 - c 的值为：", c)
a = 10
b = 5
c = a // b
print("7 - c 的值为：", c)

# Python 比较运算符
# 以下假设变量 a 为 10，变量 b 为20：
# ==	等于 - 比较对象是否相等	(a == b) 返回 False。
# !=	不等于 - 比较两个对象是否不相等	(a != b) 返回 True。
# >	大于 - 返回x是否大于y	(a > b) 返回 False。

# <	小于 - 返回x是否小于y。所有比较运算符返回1表示真，返回0表示假。
# 这分别与特殊的变量True和False等价。注意，这些变量名的大写。	(a < b) 返回 True。

# >=	大于等于 - 返回x是否大于等于y。	(a >= b) 返回 False。
# <=	小于等于 - 返回x是否小于等于y。	(a <= b) 返回 True。

a = 21
b = 10
c = 0
if (a == b):
    print("1 - a 等于 b")
else:
    print("1 - a 不等于 b")

if (a != b):
    print("2 - a 不等于 b")
else:
    print("2 - a 等于 b")

if (a < b):
    print("3 - a 小于 b")
else:
    print("3 - a 大于等于 b")

if (a > b):
    print("4 - a 大于 b")
else:
    print("4 - a 小于等于 b")

# 修改变量 a 和 b 的值
a = 5
b = 20
if (a <= b):
    print("5 - a 小于等于 b")
else:
    print("5 - a 大于  b")

if (b >= a):
    print("6 - b 大于等于 a")
else:
    print("6 - b 小于 a")


# Python逻辑运算符
# Python语言支持逻辑运算符，以下假设变量 a 为 10, b为 20:
# and	x and y	布尔"与" - 如果 x 为 False，x and y 返回 x 的值，否则返回 y 的计算值。	(a and b) 返回 20。
# or	x or y	布尔"或" - 如果 x 是 True，它返回 x 的值，否则它返回 y 的计算值。	(a or b) 返回 10。
# not	not x	布尔"非" - 如果 x 为 True，返回 False 。如果 x 为 False，它返回 True。	not(a and b) 返回 False
a = 10
b = -1
print(bool(a)) # True
print(bool(b)) # True 不为0则为true
print(a and b) # a 为 False 返回 a 的值

if (a and b):
    print("1 - 变量 a 和 b 都为 true")
else:
    print("1 - 变量 a 和 b 有一个不为 true")

if (a or b):
    print("2 - 变量 a 和 b 都为 true，或其中一个变量为 true")
else:
    print("2 - 变量 a 和 b 都不为 true")

# 修改变量 a 的值
a = 0
if (a and b):
    print("3 - 变量 a 和 b 都为 true")
else:
    print("3 - 变量 a 和 b 有一个不为 true")

if (a or b):
    print("4 - 变量 a 和 b 都为 true，或其中一个变量为 true")
else:
    print("4 - 变量 a 和 b 都不为 true")

if not (a and b):
    print("5 - 变量 a 和 b 都为 false，或其中一个变量为 false")
else:
    print("5 - 变量 a 和 b 都为 true")


# Python成员运算符
# 除了以上的一些运算符之外，Python还支持成员运算符，测试实例中包含了一系列的成员，包括字符串，列表或元组。

# in	如果在指定的序列中找到值返回 True，否则返回 False。	x 在 y 序列中 , 如果 x 在 y 序列中返回 True。
# not in	如果在指定的序列中没有找到值返回 True，否则返回 False。	x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。

a = 10
b = 20
list = [1, 2, 3, 4, 5]

if (a in list):
    print("1 - 变量 a 在给定的列表中 list 中")
else:
    print("1 - 变量 a 不在给定的列表中 list 中")

if (b not in list):
    print("2 - 变量 b 不在给定的列表中 list 中")
else:
    print("2 - 变量 b 在给定的列表中 list 中")

# 修改变量 a 的值
a = 2
if (a in list):
    print("3 - 变量 a 在给定的列表中 list 中")
else:
    print("3 - 变量 a 不在给定的列表中 list 中")


# Python身份运算符
# 身份运算符用于比较两个对象的存储单元

# is	is 是判断两个标识符是不是引用自一个对象
# x is y, 类似 id(x) == id(y) , 如果引用的是同一个对象则返回 True，否则返回 False

# is not	is not 是判断两个标识符是不是引用自不同对象
# x is not y ， 类似 id(x) != id(y)。如果引用的不是同一个对象则返回结果 True，否则返回 False。

a = 20
b = 20

if (a is b):
    print("1 - a 和 b 有相同的标识")
else:
    print("1 - a 和 b 没有相同的标识")
print(id(a))
print(id(b))
if (id(a) == id(b)):
    print("2 - a 和 b 有相同的标识")
else:
    print("2 - a 和 b 没有相同的标识")

# 修改变量 b 的值
b = 30
if (a is b):
    print("3 - a 和 b 有相同的标识")
else:
    print("3 - a 和 b 没有相同的标识")

print(id(b))
if (a is not b):
    print("4 - a 和 b 没有相同的标识")
else:
    print("4 - a 和 b 有相同的标识")

# is 与 == 区别：
# is 用于判断两个变量引用对象是否为同一个， == 用于判断引用变量的值是否相等。
a = [1, 2, 3]
b = a
print(b is a )
print(b == a )
b = a[:]
print(a,b)
print(id(a),id(b))
print(b is a)
print(b == a)


# Python运算符优先级
# 以下表格列出了从最高到最低优先级的所有运算符， 相同单元格内的运算符具有相同优先级。
# 运算符均指二元运算，除非特别指出。 相同单元格内的运算符从左至右分组（除了幂运算是从右至左分组）：

# (expressions...),[expressions...], {key: value...},{expressions...} 圆括号的表达式
# x[index], x[index:index], x(arguments...), x.attribute 读取，切片，调用，属性引用
# await x await 表达式
# ** 乘方(指数)
# +x, -x, ~x 正，负，按位非 NOT
# *, @, /, //, % 乘，矩阵乘，除，整除，取余
# +, - 加和减
# <<, >> 移位
# & 按位与 AND
# ^ 按位异或 XOR
# | 按位或 OR
# in,not in, is,is not, <, <=, >, >=, !=, == 比较运算，包括成员检测和标识号检测
# not x 逻辑非 NOT
# and 逻辑与 AND
# or 逻辑或 OR
# if -- else 条件表达式
# lambda lambda 表达式
# := 赋值表达式

a = 20
b = 10
c = 15
d = 5
e = 0

e = (a + b) * c / d  # ( 30 * 15 ) / 5   90
print("(a + b) * c / d 运算结果为：", e)

e = ((a + b) * c) / d  # (30 * 15 ) / 5   90
print("((a + b) * c) / d 运算结果为：", e)

e = (a + b) * (c / d)  # (30) * (15/5)   90
print("(a + b) * (c / d) 运算结果为：", e)

e = a + (b * c) / d  # 20 + (150/5)  50
print("a + (b * c) / d 运算结果为：", e)

# and 拥有更高优先级:
# 以上实例先计算 y and z 并返回 False ，然后 x or False 返回 True，输出结果：
x = True
y = False
z = False

if x or y and z:
    print("yes")
else:
    print("no")
